home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / mus / play / tracker_3_19.lzh / tracker / termio.c < prev    next >
C/C++ Source or Header  |  1993-11-17  |  3KB  |  191 lines

  1. /* termio.c */
  2. /* special termio discipline for sun/sgi,
  3.  * for non blocking io and such.
  4.  * These functions should not be too difficult
  5.  * to write for a PC.
  6.  */
  7.  
  8. /* $Id: termio.c,v 3.14 1993/11/17 15:31:16 espie Exp espie $
  9.  * $Log: termio.c,v $
  10.  * Revision 3.14  1993/11/17  15:31:16  espie
  11.  * *** empty log message ***
  12.  *
  13.  * Revision 3.13  1993/10/06  17:17:45  espie
  14.  * Stupid termio bug: shouldn't restore term to sanity if we don't
  15.  * know what sanity is. For instance, if we haven't modified anything.
  16.  *
  17.  * Revision 3.11  1993/07/17  12:00:30  espie
  18.  * Added other commands (numerous).
  19.  *
  20.  * Revision 3.10  1993/07/14  16:33:41  espie
  21.  * Added partial code for hpux.
  22.  *
  23.  * Revision 3.9  1993/04/28  20:14:41  espie
  24.  * My error...
  25.  *
  26.  * Revision 3.8  1993/04/25  14:50:17  espie
  27.  * cflags interpreted correctly.
  28.  *
  29.  * Revision 3.7  1993/01/16  16:23:33  espie
  30.  * Hsavolai fix.
  31.  *
  32.  * Revision 3.6  1993/01/15  14:00:28  espie
  33.  * Added bg/fg test.
  34.  *
  35.  * Revision 3.5  1993/01/06  17:58:39  espie
  36.  * Added changes for linux.
  37.  *
  38.  * Revision 3.4  1992/12/03  15:00:50  espie
  39.  * restore stty.
  40.  *
  41.  * Revision 3.3  1992/11/27  10:29:00  espie
  42.  * General cleanup
  43.  *
  44.  * Revision 3.2  1992/11/22  17:20:01  espie
  45.  * Added update_frequency call, mostly unchecked
  46.  *
  47.  * Revision 3.1  1992/11/19  20:44:47  espie
  48.  * Protracker commands.
  49.  *
  50.  */
  51.  
  52. #ifdef dec
  53. #define stub_only
  54. #endif
  55.  
  56. #ifdef linux
  57. #include <termios.h>
  58. #else
  59. #ifdef hpux
  60. #include <sys/bsdtty.h>
  61. #endif
  62. #include <sys/termio.h>
  63. #endif
  64. #include <stdio.h>
  65. #include <signal.h>
  66. #include "defs.h"
  67.  
  68. /* do not define any stdio routines if it's known not to work */
  69.  
  70. #ifdef stub_only
  71.  
  72. BOOL run_in_fg()
  73.     {
  74.     return TRUE;
  75.     }
  76.  
  77. void nonblocking_io()
  78.     {
  79.     }
  80.  
  81. void sane_tty()
  82.     {
  83.     }
  84.  
  85. int may_getchar()
  86.     {
  87.     return EOF;
  88.     }
  89.  
  90. #else
  91.  
  92. LOCAL struct termio sanity;
  93. LOCAL struct termio *psanity = 0;
  94.  
  95. LOCAL BOOL is_fg;
  96.  
  97. /* signal handler */
  98.  
  99. LOCAL void goodbye(sig)
  100. int sig;
  101.     {
  102.     fprintf(stderr, "\nSignal %d", sig);
  103.     discard_buffer();
  104.     end_all();
  105.     }
  106.  
  107. LOCAL void abort_this(sig)
  108. int sig;
  109.     {
  110.     discard_buffer();
  111.     exit(0);
  112.     }
  113.  
  114. BOOL run_in_fg()
  115.     {
  116.     int val;
  117.     /* real check for running in foreground */
  118.     if (ioctl(fileno(stdin), TIOCGPGRP, &val))
  119.         return FALSE; 
  120.     if (val == getpgrp())
  121.         return TRUE;
  122.     else
  123.         return FALSE;
  124.     }
  125.  
  126. LOCAL void switch_mode()
  127.     {
  128.     struct termio zap;
  129.  
  130.     signal(SIGCONT, switch_mode);
  131.     signal(SIGINT, goodbye);
  132.     signal(SIGQUIT, goodbye);
  133.     signal(SIGUSR1, abort_this);
  134.  
  135.     if (run_in_fg())
  136.         {
  137.         ioctl(fileno(stdin), TCGETA, &zap);
  138. #ifdef linux
  139.         zap.c_cc[VMIN] = 0;
  140.         zap.c_cc[VTIME] = 0;
  141. /* Commented out
  142. As Hannu said:
  143. The current Linux kernel interprets correctly the c_lflags field so it
  144. should be set like for the other systems. 
  145.         zap.c_lflag = 0;
  146.  */
  147. #else
  148.         zap.c_cc[VEOL] = 0;
  149.         zap.c_cc[VEOF] = 0;
  150. #endif
  151.         zap.c_lflag &= ~(ICANON | ECHO);
  152.         ioctl(fileno(stdin), TCSETA, &zap);
  153.         is_fg = TRUE;
  154.         }
  155.     else
  156.         is_fg = FALSE;
  157.     }
  158.  
  159. void nonblocking_io()
  160.     {
  161.     /* try to renice our own process to get more cpu time */
  162.     if (nice(-15) == -1)
  163.         nice(0);
  164.     if (!psanity)
  165.         {
  166.         psanity = &sanity;
  167.         ioctl(fileno(stdin), TCGETA, psanity);
  168.         }
  169.     switch_mode();
  170.     }
  171.  
  172.  
  173. void sane_tty()
  174.     {
  175.     if (psanity)
  176.         ioctl(fileno(stdin), TCSETA, psanity);
  177.     }
  178.  
  179. int may_getchar()
  180.     {
  181.     char buffer;
  182.  
  183.     if (run_in_fg() && !is_fg)
  184.         switch_mode();
  185.     if (run_in_fg() && read(fileno(stdin), &buffer, 1))
  186.         return buffer;
  187.     return EOF;
  188.     }
  189.  
  190. #endif
  191.